package com.hundsun.aitest.service.impl;

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.hundsun.aitest.common.Constants;
import com.hundsun.aitest.model.ai.AutoCase;
import com.hundsun.aitest.model.ai.ChatRequest;
import com.hundsun.aitest.service.LargeModelService;
import com.hundsun.aitest.util.HttpUtils;
import com.hundsun.aitest.util.YamlOperationUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class LargeModelServiceImpl implements LargeModelService {
//    private static final String API_URL = "https://api.example.com/v1/chat/completions";
//    private static final String API_KEY = "your_api_key_here"; // 替换为实际的API密钥

    private final ObjectMapper objectMapper = new ObjectMapper();

    // 内置的prompt结构化内容
    private static final Map<String, String> STRUCTURED_CONTENT = new HashMap<>();
    static {
        STRUCTURED_CONTENT.put("precontext", "作为一个测试专家，根据下面的测试点描述和接口定义，以及生成原则，生成接口的数据集。一个接口根据测试点描述构造1到多组参数。按照返回数据集格式直接返回json格式的内容，不要有其他内容。");
        STRUCTURED_CONTENT.put("generateRule", "生成原则：\n" +
                "1,接口参数根据测试点描述结合入参定义来生成。注意如果接口参数的example不会null，相关参数的值请参考example中定义的值来生成。\n" +
                "2,预计结果参数，请根据测试目的结合接口定义中的出参定义来生成。\n");
        STRUCTURED_CONTENT.put("returnFormat","返回数据集格式(注意返回的内容要严格符合json格式要求)：\n" +
                "{\n" +
                "\t\"interface\": xxxxx,\n" +
                "\t\"keys\" :[\n" +
                "\t{\n" +
                "\t//测试目的用于区分这组数据的测试目的\n" +
                "\t\"测试目的\":\"xxxxx\",\n" +
                "\t//接口参数：根据接口定义给出\n" +
                "\t\"接口参数\":{\n" +
                "\t\t\"param1\":\"xxxx\"\n" +
                "\t\t},\n" +
                "\t//描述测试结果的验证内容\n" +
                "\t\"测试结果\":\"xxxxx\",\n" +
                "\t\"预计结果参数\": [\n" +
                "\t\t\t\t{\n" +
                "\t\t\t\t\t\"name\": \"xxxx\",\n" +
                "\t\t\t\t\t\"value\": \"xxxx\",\n" +
                "\t\t\t\t\t\"path\": \"xxxxx\"\n" +
                "\t\t\t\t}],"+
                "\t\"正反例\": \"正例\",\n" +
                "\t//优先级P0到P3,P0最高\n" +
                "\t\"优先级\":\"P0\"\n" +
                "\t}\n" +
                "\t]\n" +
                "}\n");
    }


    @Override
    public String sendRequest(ChatRequest chatRequest) throws JsonProcessingException {
        Map<String, String> headers = new HashMap<>();
        headers.put("Authorization", Constants.Authorization_CODE);
        headers.put("Content-Type", "application/json");
        chatRequest.setUser(Constants.MODEL_USER);
        //这里设置的是默认的模型，用的是千问的模型
        chatRequest.setModel(Constants.MODEL_NAME_QWEN);
        //token数设置
        chatRequest.setMaxTokens("4096");
        String requestBody = null;
        requestBody = objectMapper.writeValueAsString(chatRequest);

        return HttpUtils.sendPostJsonRequest(Constants.CHAT_URL,requestBody,headers);
    }

    @Override
    public String parseResponse(String response) throws JsonProcessingException {
        JsonNode rootNode = objectMapper.readTree(response);

        AutoCase autoCase = new AutoCase();
        JsonNode choicesNode = rootNode.get("choices");
        String jsonString=null;
        if (choicesNode != null && choicesNode.size() > 0) {
            JsonNode firstChoice = choicesNode.get(0);
            JsonNode messageNode = firstChoice.get("message");
            if (messageNode != null) {
//                return messageNode.get("content").asText();
                jsonString=messageNode.get("content").asText();

            }
        }
        return jsonString;
    }

    /**
     * 构建一个完整的 prompt，包括角色、用户输入、内置内容和格式要求。
     *
     * @param userInput 用户提供的输入文本。
     * @return 完整的 prompt 文本。
     */
    @Override
    public String buildPrompt(String userInput,String interfaceDesc, String tableStructure) {
//        StringBuilder promptBuilder = new StringBuilder();
//
//        // 添加前置内容
//        promptBuilder.append(STRUCTURED_CONTENT.get("precontext")).append("\n");
//
//        //添加测试点描述
//        promptBuilder.append("测试点：").append("\n").append(userInput).append("\n");
//
//        // 添加生成原则
//        promptBuilder.append(STRUCTURED_CONTENT.get("generateRule")).append("\n");
//
//        //添加接口定义
//        promptBuilder.append("接口定义：").append("\n").append(interfaceDesc).append("\n");
//
//        // 添加返回格式
//        promptBuilder.append(STRUCTURED_CONTENT.get("returnFormat"));
//        return promptBuilder.toString();
        String yamlPath = "prompt/AuoTestCaseGenerate.yaml";
        Map<String, Object> inputDataOne = new HashMap<>();
        //测试点描述
        inputDataOne.put("testPoint", userInput);
        inputDataOne.put("interfaceDesc", interfaceDesc);
        inputDataOne.put("tableStructure", tableStructure);
        List<String> prompts = YamlOperationUtils.getPromptQuestion(yamlPath, inputDataOne);
        if(prompts!=null&&prompts.size()>0){
            return prompts.get(0);
        }
        return "";
    }

}
